/**
 * @Copyright ®2015 Sinosoft Co. Ltd. All rights reserved.<br/>
 * 项目名称 : 电子商务云服务平台
 * 创建日期 : 2016年6月28日
 * 修改历史 : 
 *     1. [2016年6月30日]修改文件 by chihouliang
 * 添加Javadoc注释，更新代码规范，静态工具类增加private构造函数
 */
package com.gavinwind.inspay.common.util;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

/**
 * 
 * IP处理工具，提供功能如下：<br/>
 * 1、能够判断是linux系统或window系统。<br/>
 * 2、获取本地ip。<br/>
 * 3、传入HttpServletRequest对象，获取远程服务器的IP
 * 
 * @author
 * @date 2016年6月28日 下午3:14:17
 * @version 1.0
 */
public class IpUtil {

    /*
     * 工具类不允许实例化
     */
    private IpUtil() {}

    /**
     * 
     * 传入HttpServletRequest对象，获取远程服务器ip。不进行非空验证，如果传入null，将抛出系统异常
     * 
     * @param cHttpServletRequest
     *            HttpServletRequest对象
     * @return 服务器IP
     */
    public static String getIpAddrByRequest(HttpServletRequest cHttpServletRequest) {
        String tIp = cHttpServletRequest.getHeader("x-forwarded-for");
        if (tIp == null || tIp.length() == 0 || "unknown".equalsIgnoreCase(tIp)) {
            tIp = cHttpServletRequest.getHeader("Proxy-Client-tIp");
        }
        if (tIp == null || tIp.length() == 0 || "unknown".equalsIgnoreCase(tIp)) {
            tIp = cHttpServletRequest.getHeader("WL-Proxy-Client-tIp");
        }
        if (tIp == null || tIp.length() == 0 || "unknown".equalsIgnoreCase(tIp)) {
            tIp = cHttpServletRequest.getRemoteAddr();
        }
        return tIp;
    }

    /**
     * 
     * 判断是否为window系统，返回true时为window系统
     * 
     * @return true是为window系统
     */
    public static boolean isWindowsOS() {
        boolean tIsWindowsOS = false;
        String tOsName = System.getProperty("os.name");
        if (tOsName.toLowerCase().indexOf("windows") > -1) {
            tIsWindowsOS = true;
        }
        return tIsWindowsOS;
    }

    /**
     * 获取本地系统的IP地址
     * 
     * @return 返回本地系统IP
     */
    public static String getLocalIP() {
        String tSIP = "";
        InetAddress tIp = null;
        try {
            // 如果是Windows操作系统
            if (isWindowsOS()) {
                tIp = InetAddress.getLocalHost();
            }
            // 如果是Linux操作系统
            else {
                boolean tFindIP = false;
                Enumeration<NetworkInterface> tNetInterfaces = (Enumeration<NetworkInterface>) NetworkInterface.getNetworkInterfaces();
                while (tNetInterfaces.hasMoreElements()) {
                    if (tFindIP) {
                        break;
                    }
                    NetworkInterface tNetworkInterface = (NetworkInterface) tNetInterfaces.nextElement();
                    // ----------特定情况，可以考虑用tNetworkInterface.getName判断
                    // 遍历所有ip
                    Enumeration<InetAddress> tIps = tNetworkInterface.getInetAddresses();
                    while (tIps.hasMoreElements()) {
                        tIp = (InetAddress) tIps.nextElement();
                        if (tIp.isSiteLocalAddress() && !tIp.isLoopbackAddress() // 127.开头的都是lookback地址
                                && tIp.getHostAddress().indexOf(":") == -1) {
                            tFindIP = true;
                            break;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (null != tIp) {
            tSIP = tIp.getHostAddress();
        }
        return tSIP;
    }
}
